package com.ly.jvm;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

public class OOMDemo {

    static class Meta{

    }

    public static void OOM_JavaHeapSpace() {
        byte b[] = new byte[1024*1024*100];
    }

    public static void OOM_GCOverHeadLimit() {
        int i =0;
        List<String> list = new ArrayList<>();
        while (true) {
            list.add(String.valueOf(i++).intern());
        }

    }

    public static void OOM_DirectBufferMemoryDemo() {
        ByteBuffer bb = ByteBuffer.allocateDirect(6*1024*1024);
    }

    public static void OOM_UnableToCreateNewNativeThread() {
        //虚拟机尝试，主机爆炸
//        for(int i=0;;i++) {
//            new Thread( () -> {},String.valueOf(i)).start();
//        }
    }

    public static void OOM_Meta() {
//        需要<dependency>
//                <groupId>cglib</groupId>
//                <artifactId>cglib</artifactId>
//                <version>3.1.txt</version>
//            </dependency>
//        int i = 0;
//        while (true) {
//            System.out.println(i++);
//            Enhancer enhancer = new Enhancer();
//            enhancer.setSuperclass(Permanent.class);
//            enhancer.setUseCache(false);
//            enhancer.setCallback(
//                    new MethodInterceptor() {
//                        @Override
//                        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//                            return methodProxy.invokeSuper(o, args);
//                        }
//                    }
//            );
//            enhancer.create();
//        }
    }

    public static void main(String[] args) {
//        OOM_JavaHeapSpace();
//        OOM_GCOverHeadLimit();
//        OOM_DirectBufferMemoryDemo();
//        OOM_Meta();
    }
}
